﻿// ProcessMasterDlg.h: 头文件
//

#pragma once
#include "LogSystem.h"  // 包含日志系统头文件
#include <TlHelp32.h>

// 进程CPU使用率信息结构体
typedef struct _PROCESS_CPU_INFO
{
    DWORD processID;             // 进程ID
    ULARGE_INTEGER lastCPUTime;  // 上次CPU时间
    ULONGLONG lastUpdateTime;    // 上次更新时间
    double cpuUsage;              // CPU使用率（百分比）
} PROCESS_CPU_INFO, *PPROCESS_CPU_INFO;

// 进程类型枚举
enum ProcessType
{
	PROCESS_TYPE_UNKNOWN = 0,
	PROCESS_TYPE_APP,
	PROCESS_TYPE_BACKGROUND,
	PROCESS_TYPE_WINDOWS
};

// 分组标题标识符
#define GROUP_HEADER_APP       0xFFFF0001
#define GROUP_HEADER_BACKGROUND 0xFFFF0002
#define GROUP_HEADER_WINDOWS   0xFFFF0003

// 进程信息结构体
struct ProcessInfo
{
	PROCESSENTRY32 pe32;
	TCHAR szProcessPath[MAX_PATH];
	int iconIndex;
	HICON hIcon;
	double cpuUsage;
	SIZE_T memoryUsage;
	ProcessType type;
};

// CProcessMasterDlg 对话框
class CProcessMasterDlg : public CDialogEx
{
// 构造
public:
	CProcessMasterDlg(CWnd* pParent = nullptr);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_PROCESSMASTER_DIALOG };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持

// 实现
protected:
	HICON m_hIcon;

	//控件变量
	CListCtrl m_processList;      // 进程列表
	CButton m_btnEndProcess;
	CButton m_btnProcessDetail;
	CFont m_fontList;  // 列表控件字体
	CImageList m_imageList; // 进程图标图像列表
	int m_nItemHeight; // 列表项高度

	// 当前选中的项
	int m_nCurrentItem;

	// 存储进程CPU使用率信息的映射表
	CMap<DWORD, DWORD, PROCESS_CPU_INFO, PROCESS_CPU_INFO&> m_ProcessCPUInfo;
	
	// 上次更新CPU信息的时间
	ULARGE_INTEGER m_lastUpdateTime;

	// 定时器ID
	UINT_PTR m_timerID;

public:
	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()

public:
	void CreateControls();//初始化所有控件
	void InitProcessLists();//初始化进程列表
	void SetupWindowStyle();// 设置窗口样式和外观
	void RefreshProcessLists();//刷新进程列表数据
	BOOL EnableDebugPrivilege();//提升进程权限
	DWORD GetSelectedProcessID();//获取选中进程ID
	double GetProcessCPUUsage(DWORD dwProcessID);//获取指定进程的CPU使用率
	void UpdateAllProcessCPUUsage();//更新所有进程的CPU使用率

	//消息处理函数
	afx_msg void OnSize(UINT nType,int cx,int cy);//处理窗口大小改变 

	afx_msg void OnBtnEndProcess();//结束进程按钮点击事件 

	afx_msg void OnBtnProcessDetail();//进程详情按钮点击事件

	afx_msg void OnClose();//窗口关闭事件

	afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpMMI);

	afx_msg BOOL OnEraseBkgnd(CDC* pDC); // 用于绘制背景图片

	afx_msg void OnCustomDrawList(NMHDR* pNMHDR, LRESULT* pResult); // 自定义绘制进程列表

	afx_msg void OnTimer(UINT_PTR nIDEvent); // 定时器消息处理函数

	afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

	afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

	afx_msg void OnListScroll(NMHDR* pNMHDR, LRESULT* pResult);

	afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);

	afx_msg void OnClickList(NMHDR *pNMHDR, LRESULT *pResult);
	
	// 菜单命令处理函数
	afx_msg void OnHelpAbout();
	afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);  // 右键菜单
	afx_msg void OnProcessDetail();                         // 进程详情菜单项
	afx_msg void OnEndProcess();                           // 结束进程菜单项

private:
	CBitmap m_bmpBackground;  // 背景图片

	BOOL LoadBackgroundImage(UINT nResourceID = IDB_BACKGROUND); // 加载背景图片

	int GetProcessIcon(LPCTSTR szProcessPath, HICON& hIcon); // 获取进程图标

	ProcessType GetProcessType(LPCTSTR szProcessPath, LPCTSTR szExeFile); // 获取进程类型

	// 窗口过程子类化相关
	BOOL m_bIsScrolling; // 是否正在滚动
	DWORD m_dwLastScrollTime; // 最后一次滚动时间
	WNDPROC m_pOldListProc; // 原始窗口过程
	int m_nScrollPos; // 滚动位置
	
	// 声明窗口过程函数为友元函数
	friend LRESULT CALLBACK ListViewProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

	// 进程列表相关
	void AddProcessToList(CListCtrl& listCtrl, const ProcessInfo& processInfo, int index, DWORD selectedProcessID, int& selectedItemIndex);
	ProcessInfo CollectProcessInfo(const PROCESSENTRY32& pe32, DWORD selectedProcessID, int& selectedItemIndex);
	void InitProcessListControl(CListCtrl& listCtrl); // 初始化单个进程列表控件
};
